import axios from 'axios';
import { WxConfig } from './types';
import { WxTokenSDK } from './WxTokenSDK';

export class WxTemplateMsgSDK {
  private config: WxConfig;
  private tokenSDK: WxTokenSDK;
  private baseUrl = 'https://api.weixin.qq.com/cgi-bin/message/subscribe';

  constructor(config: WxConfig) {
    this.config = config;
    this.tokenSDK = new WxTokenSDK(config);
  }

  /**
   * 发送小程序订阅消息
   * @param openid 接收者（用户）的 openid
   * @param templateId 所需下发的订阅模板id
   * @param data 模板内容，格式形如 { "key1": { "value": "value1" }, "key2": { "value": "value2" } }
   * @param page 点击模板卡片后的跳转页面，支持带参数（示例index?foo=bar）
   * @param lang 进入小程序查看"的语言类型，支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文)，默认为zh_CN
   */
  async send(params: {
    openid: string;
    templateId: string;
    data: Record<string, { value: string }>;
    page?: string;
    lang?: 'zh_CN' | 'en_US' | 'zh_HK' | 'zh_TW';
    miniprogramState?: 'developer' | 'trial' | 'formal';
  }): Promise<boolean> {
    try {
      const accessToken = await this.tokenSDK.getAccessToken();
      const url = `${this.baseUrl}/send?access_token=${accessToken}`;
      
      const { data } = await axios.post(url, {
        touser: params.openid,
        template_id: params.templateId,
        page: params.page,
        data: params.data,
        miniprogram_state: params.miniprogramState || 'formal',
        lang: params.lang || 'zh_CN'
      });
      
      if (data.errcode !== 0) {
        throw new Error(`发送订阅消息失败: ${data.errmsg} (${data.errcode})`);
      }
      
      return true;
    } catch (error: any) {
      console.error(`发送订阅消息失败: ${error.message}`);
      return false;
    }
  }
  
  /**
   * 获取当前帐号下的个人模板列表
   */
  async getTemplateList(): Promise<any[]> {
    try {
      const accessToken = await this.tokenSDK.getAccessToken();
      const url = `https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token=${accessToken}`;
      
      const { data } = await axios.get(url);
      
      if (data.errcode !== 0) {
        throw new Error(`获取模板列表失败: ${data.errmsg} (${data.errcode})`);
      }
      
      return data.data || [];
    } catch (error: any) {
      console.error(`获取模板列表失败: ${error.message}`);
      return [];
    }
  }
  
  /**
   * 发送统一的消息通知
   * @param openid 用户openid
   * @param templateType 模板类型，如 'admission', 'payment', 'reminder' 等
   * @param templateData 模板数据
   */
  async sendNotification(
    openid: string,
    templateType: 'admission' | 'payment' | 'reminder' | 'registration',
    templateData: Record<string, string>
  ): Promise<boolean> {
    // 模板ID映射
    const templateMap: Record<string, string> = {
      admission: 'qg7QyEcj9LC3aRuypnDE9q3010MepT1SROjjx00sgX8', // 录取通知模板ID
      payment: 'YOUR_PAYMENT_TEMPLATE_ID',     // 缴费通知模板ID
      reminder: 'YOUR_REMINDER_TEMPLATE_ID',   // 提醒通知模板ID
      registration: 'YOUR_REGISTRATION_TEMPLATE_ID' // 注册通知模板ID
    };
    
    // 获取对应的模板ID
    const templateId = templateMap[templateType];
    if (!templateId) {
      console.error(`未找到模板类型 ${templateType} 的模板ID`);
      return false;
    }
    
    // 转换数据格式为微信要求的格式，并进行长度限制
    const data: Record<string, { value: string }> = {};
    
    // 不同字段类型的最大长度限制
    const fieldLimits: Record<string, number> = {
      thing: 20,    // 20个以内字符
      phrase: 5,    // 5个以内汉字
      name: 10,     // 10个以内字符
      time: 24,     // 24小时制时间格式
      date: 10,     // 年月日格式
      amount: 10,   // 数字，最多一位小数
      short_thing: 5 // 5个以内汉字
    };
    
    for (const [key, value] of Object.entries(templateData)) {
      // 确定字段类型
      let fieldType = '';
      for (const type of Object.keys(fieldLimits)) {
        if (key.includes(type)) {
          fieldType = type;
          break;
        }
      }
      
      // 如果找到了字段类型，进行长度限制
      let formattedValue = value;
      if (fieldType && fieldLimits[fieldType]) {
        formattedValue = value.substring(0, fieldLimits[fieldType]).trim();
      }
      
      data[key] = { value: formattedValue };
    }
    
    console.log('发送模板消息数据:', JSON.stringify(data));
    
    // 发送模板消息
    return await this.send({
      openid,
      templateId,
      data,
      page: templateType === 'admission' ? 'pages/enrollment/admission' : 'pages/home/home' // 根据类型设置不同页面
    });
  }
} 